package org.pac4j.play;
import org.pac4j.core.config.Config;
import org.pac4j.core.engine.CallbackLogic;
import org.pac4j.core.engine.DefaultCallbackLogic;
import org.pac4j.play.store.PlaySessionStore;
import play.mvc.Controller;
import play.mvc.Result;
import play.libs.concurrent.HttpExecutionContext;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import javax.inject.Inject;
import static org.pac4j.core.util.CommonHelper.assertNotNull;
/**
* <p>This filter finishes the login process for an indirect client, based on the {@link #callbackLogic}.</p>
*
* <p>The configuration can be provided via setters: {@link #setDefaultUrl(String)} (default url after login if none was requested) and
* {@link #setMultiProfile(boolean)} (whether multiple profiles should be kept).</p>
*
* @author Jerome Leleu
* @author Michael Remond
* @since 1.5.0
*/
public class CallbackController extends Controller {
private CallbackLogic<Result, PlayWebContext> callbackLogic = new DefaultCallbackLogic<>();
private String defaultUrl;
private Boolean multiProfile;
@Inject
protected Config config;
@Inject
protected PlaySessionStore playSessionStore;
@Inject
protected HttpExecutionContext ec;
public CompletionStage<Result> callback() {
assertNotNull("callbackLogic", callbackLogic);
assertNotNull("config", config);
final PlayWebContext playWebContext = new PlayWebContext(ctx(), playSessionStore);
return CompletableFuture.supplyAsync(() -> callbackLogic.perform(playWebContext, config, config.getHttpActionAdapter(), this.defaultUrl, this.multiProfile, false), ec.current());
}
public String getDefaultUrl() {
return defaultUrl;
}
public void setDefaultUrl(final String defaultUrl) {
this.defaultUrl = defaultUrl;
}
public boolean isMultiProfile() {
return multiProfile;
}
public void setMultiProfile(final boolean multiProfile) {
this.multiProfile = multiProfile;
}
public Config getConfig() {
return config;
}
public void setConfig(final Config config) {
this.config = config;
}
}